package com.king.designpatterns.行为模式.中介者模式;

/**
 * 中介者模式（Mediator）也称调停者模式，是一种比较简单的模式。
 *
 * 定义：用一个中介对象封装一系列对象（同事）的交互，中介者使各对象不需要显式地相互作用，从而使其耦合松散，而且可以独立地改变它们之间的交互。
 *
 * 角色：
 *      ■ 抽象中介者（Mediator）角色：
 *          该角色定义出同事对象到中介者对象的统一接口，用于各同事角色之间的通信。
 *      ■ 具体中介者（Concrete Mediator）角色：
 *          该角色实现抽象中介者，它依赖于各个同事角色，并通过协调各同事角色实现协作行为。
 *      ■ 抽象同事（Colleague）角色：
 *          该角色定义出中介者到同事对象的接口，同事对象只知道中介者而不知道其余的同事对象。
 *      ■ 具体同事（Concrete Colleague）角色：
 *          该角色实现抽象同事类，每一个具体同事类都清楚自己在小范围内的行为，而不知道大范围内的目的。
 *
 * 优缺点：
 *      优点：
 *          ■ 减少类间的依赖，将原有的一对多的依赖变成一对一的依赖，使得对象之间的关系更易维护和理解。
 *          ■ 避免同事对象之间过度耦合，同事类只依赖于中介者，使同事类更易被复用，中介类和同事类可以相对独立地演化。
 *          ■ 中介者模式将对象的行为和协作抽象化，将对象在小尺度的行为上与其他对象的相互作用分开处理。
 *      缺点：
 *          ■ 中介者模式降低了同事对象的复杂性，但增加了中介者类的复杂性。
 *          ■ 中介者类经常充满了各个具体同事类的关系协调代码，这种代码是不能复用的。
 *
 * 注意事项：
 *      ■ 不应当在责任划分混乱时使用。
 *          通常情况下，一个初级设计师在面向对象的技术不熟悉时，会使一个系统在责任的分割上发生混乱。
 *          责任分割的混乱会使得系统中的对象与对象之间产生不适当的复杂关系。
 *      ■ 不应当对数据类和方法类使用。
 *          初级设计师常常会设计出这样一种系统，让一系列类只含有数据，另一些类只含有方法。
 *          例如，描述一个客户时，这些设计师首先设计出一个“客户数据”类，只含有客户数据；
 *          另外再设计一个类叫做“管理类”，含有操作客户以及此客户购买公司产品、付账的方法。
 *          管理类自然会涉及其他的类，诸如产品数据类、订单数据类、付账数据类、应收账数据类等。这不是一种好的设计方式，也不是中介者模式。
 *      ■ 正确理解封装。
 *          封装首先是行为，以及行为所涉及的状态的封装。行为与状态是不应该分割开的。
 *          中介者模式的用途是管理很多的对象的相互作用，以便使这些对象可以专注于自身的行为。
 *
 * @author king
 * @date 2021-06-10 17:48
 */
public class MediatorPattern {
    public static void main(String[] args) {
        MarriageAgency agency = new MarriageAgencyImpl();
        Person m1 = new Man("John", 20, 18, agency);
        Person m2 = new Man("Mike", 27, 25, agency);
        Person w1 = new Woman("Mary", 25, 27, agency);
        Person w2 = new Woman("Jane", 20, 22, agency);
        m1.findPartner();
        m2.findPartner();
    }
}
